package com.sma.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import com.sma.pojo.Transaction;

/**
 * 交易验证器类，用于验证Transaction对象的合法性。
 * 实现了Spring的Validator接口，用于在业务逻辑中进行数据验证。
 */
public class TransactionValidator implements Validator {

    /**
     * 判断当前验证器是否支持指定的类。
     * 本验证器仅支持com.sma.pojo.Transaction类的验证。
     *
     * @param clazz 需要验证的类
     * @return 如果clazz等于Transaction类，则返回true；否则返回false。
     */
    @Override
    public boolean supports(Class<?> clazz) {
        // 匹配为交易记录类型
        return Transaction.class.equals(clazz);
    }

    /**
     * 对Transaction对象进行验证。
     * 验证交易金额是否等于价格乘以数量。
     * 如果不相等，则认为数据不合法，将错误信息添加到Errors对象中。
     *
     * @param target 需要验证的对象，类型应为Transaction
     * @param errors 用于收集验证过程中发现的错误信息的对象
     */
    @Override
    public void validate(Object target, Errors errors) {
        // 强制转换类型
        Transaction trans = (Transaction) target;

        // 计算交易金额与价格乘以数量的差值
        // 求交易金额和价格×数量的差额
        double dis = trans.getAmount()
                - (trans.getPrice() * trans.getQuantity());

        // 如果差值的绝对值大于0.01，认为交易金额与价格乘以数量不匹配，添加错误信息
        // 如果差额大于0.01，则认为业务错误
        if (Math.abs(dis) > 0.01) {
            //加入错误信息
            errors.rejectValue("amount", null, "交易金额和购买数量与价格不匹配");
        }
    }

}
